package main.java.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
    JDK5之后，java推出了一个新特性-泛型
    泛型也成为参数化类型，允许一个类在使用时在指定一个类型给它，用语确定其内部某个属性的类型或方法
    参数的类型或返回值的类型，使用更便捷。
    在集合中泛型广泛使用，用于规定集合中的元素类型


    集合的遍历
    集合提供了统一的遍历方式:迭代器模式
    其中删除操作不是遍历的必要过程
    迭代器在第一个元素之前，不能删除，否则会抛出异常
 */
public class IteratorDemo {
    public static void main(String[] args) {
        //泛型，在集合中，泛型只能是引用类型
        //不能是基本数据类型
        Collection<String> c = new ArrayList<>();
        //添加元素
        c.add("java");
        c.add("#");
        c.add("c");
        c.add("#");
        c.add("c++");
        c.add("#");
        c.add("python");
        c.add("#");
        //实参不符合方法参数泛型的实际类型，编译器报错
        //c.add(100);


        /*
                选代器有两个重要的力法:
                boolean hasNext():判断集合是合还有下一个元素可供遍历  问询
                E next():送代器获取下一个元素                       取
         */
        //获取迭代器，遍历集合c
        //迭代器也支持泛型，语遍历的集合泛型一致即可
        Iterator<String> it = c.iterator();
        //判断是否还有元素  hasNext：下一个元素是否存在
        while (it.hasNext()) {
            //获取元素，next()方法返回一个Object，需要造型
            String str = it.next();
            //判断是否是#
            //宁符串变量与字面量equals时要将字面量放前面，避免空指针
            if ("#".equals(str)){
                //删除当前元素，删除后，迭代器会自动往前移动一位
                //迭代器遍历过程中不允许通过集合的方法增删元素，否则会抛出异常
                //c.remove(str);
                //迭代器的remove不需要传递参数，删除的是本次next获取的元素
                it.remove();
            }
        }
        //输出数组的元素
        System.out.println(c);
    }
}
